//请实现一个函数用来判断字符串是否表示数值（包括整数和小数）。
//
// 数值（按顺序）可以分成以下几个部分：
//
//
// 若干空格
// 一个 小数 或者 整数
// （可选）一个 'e' 或 'E' ，后面跟着一个 整数
// 若干空格
//
//
// 小数（按顺序）可以分成以下几个部分：
//
//
// （可选）一个符号字符（'+' 或 '-'）
// 下述格式之一：
//
// 至少一位数字，后面跟着一个点 '.'
// 至少一位数字，后面跟着一个点 '.' ，后面再跟着至少一位数字
// 一个点 '.' ，后面跟着至少一位数字
//
//
//
//
// 整数（按顺序）可以分成以下几个部分：
//
//
// （可选）一个符号字符（'+' 或 '-'）
// 至少一位数字
//
//
// 部分数值列举如下：
//
//
// ["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]
//
//
// 部分非数值列举如下：
//
//
// ["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]
//
//
//
//
// 示例 1：
//
//
//输入：s = "0"
//输出：true
//
//
// 示例 2：
//
//
//输入：s = "e"
//输出：false
//
//
// 示例 3：
//
//
//输入：s = "."
//输出：false
//
// 示例 4：
//
//
//输入：s = "    .1  "
//输出：true
//
//
//
//
// 提示：
//
//
// 1 <= s.length <= 20
// s 仅含英文字母（大写和小写），数字（0-9），加号 '+' ，减号 '-' ，空格 ' ' 或者点 '.' 。
//
// Related Topics 字符串 👍 340 👎 0


package leetcode.editor.cn;

//Java：表示数值的字符串
public class BiaoShiShuZhiDeZiFuChuanLcof {
    public static void main(String[] args) {
        Solution solution = new BiaoShiShuZhiDeZiFuChuanLcof().new Solution();
        // TO TEST
        System.out.println(solution.isNumber("+100"));
        System.out.println(solution.isNumber("5e2"));
        System.out.println(solution.isNumber("-123"));
        System.out.println(solution.isNumber("3.1416"));
        System.out.println(solution.isNumber("-1E-16"));
        System.out.println(solution.isNumber("0123"));
        System.out.println(solution.isNumber("12e"));
        System.out.println(solution.isNumber("1a3.14"));
        System.out.println(solution.isNumber("1.2.3"));
        System.out.println(solution.isNumber("+-5"));
        System.out.println(solution.isNumber("12e+5.4"));
        System.out.println(solution.isNumber("1 "));
        System.out.println(solution.isNumber("    .1  "));
        System.out.println(solution.isNumber("."));
        System.out.println(solution.isNumber("e"));
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public int start = 0;

        public boolean isNumber(String s) {
            if (s == null || s.equals(""))
                return false;
            boolean result = false;
            // 引用值
            start = 0;
            char[] nums = s.toCharArray();
            // 1、若干空格
            charEmpty(nums);

            // 2、一个小数或者整数
            // 2.1、一个小数
            // 2.1.1、点号前面可能有数字，点号后面可能有数字，点的前后都有数字
            result = signedInteger(nums);
            if (start < s.length() && nums[start] == '.') {
                start++;
                result = unsignedInteger(nums) || result;
            }
            // 2.2、
            if (start < s.length() && (nums[start] == 'e' || nums[start] == 'E')) {
                start++;
                result = result && signedInteger(nums);
            }
            // 若干空格
            charEmpty(nums);
            return result && start == s.length();
        }

        public void charEmpty(char[] nums) {
            for (int i = start; i < nums.length; i++) {
                if (nums[i] == ' ') {
                    start++;
                } else {
                    break;
                }
            }
        }

        public boolean signedInteger(char[] nums) {
            if (start < nums.length && (nums[start] == '+' || nums[start] == '-'))
                start++;
            return unsignedInteger(nums);
        }

        /**
         * 至少一位数字
         * @param nums
         * @return
         */
        public boolean unsignedInteger(char[] nums) {
            int lmp = start;
            int nlen = nums.length;
            for (int i = start; i < nlen; i++) {
                if (nums[start] >= '0' && nums[start] <= '9')
                    start++;
                else {
                    break;
                }
            }
            return start > lmp;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}
